None
Для работы получены 4 файла:
Daily_Duration.xlsxDaily_Attention.xlsxDaily_Reach_OTS.xlsxReach000%.xlsxПредоставленные массивы данных об отдельных аудиториях диджитал-ресурсов среди населения России в возрасте 12 лет и старше в динамике за 3 месяца. Содержаться как общие показатели среди населения, так и в разбивке на возрастные группы и устройство контакта - Web Desktop (ПК и ноутбуки), App Mobile (Мобильное приложение), Web Mobile (Мобильный браузер). Все файлы содержат идентичный набор ресурсов за один и тот же период.
| AddPerP | Average Daily Duration на население |
| Среднее количество минут в день, проведенное человеком на медиа объекте. Рассчитывается время контакта с медиа объектом для среднего пользователя относительно генеральной совокупности. | |
| AddPerU | Average Daily Duration на пользователей |
| Среднее количество минут в день, проведенное пользователем на медиа объекте. Рассчитывается время контакта с медиа объектом для среднего пользователя относительно среднедневной аудитории медиа объекта. | |
| ADR | Average Daily Reach |
| Рассчитывается как среднее арифметическое Reach каждого из дней, входящих в заданный период. Даже если данные по медиа объекту отсутствуют в части дней из отобранного периода, среднее арифметическое рассчитывается по всем дням, а не по тем, где были данные. | |
| OTS | Opportunity To See |
| Общее количество загрузок страниц/ открытий приложений медиа объекта за указанный период в рамках заданной соц.-дем. группы. | |
| ADATT | Average Daily Attention |
| Средняя доля проведенного на медиа объекте времени от общего времени пребывания в интернете за день. | |
| Reach | Reach |
| Количество человек в генеральной совокупности или в заданной соц.-дем. группе, которые зашли на страницы/ открыли приложения медиа объекта, входящие в него, хотя бы один раз за указанный период. | |
| ReachPer | Reach% |
| Количество человек, заходивших на медиа объект хотя бы один раз за указанный период, в % от генеральной совокупности или заданной соц.-дем. группы. |
Провести анализ EDA данных из файла Daily_Duration с метриками AddPerP и AddPerU:
Daily_DurationAverage Daily Duration суммарно по всем возрастным категориям.Average Daily Duration суммарно по всем возрастным категориям для выбранных источников информации.Average Daily Duration .Average Daily Duration.Average Daily Duration.Average Daily Duration.Average Daily Duration.Average Daily Duration.# Все import соберем в начале проекта:
import warnings
warnings.filterwarnings('ignore')
import pandas as pd
import os
import seaborn as sns
import re
from skimpy import skim, clean_columns
from datetime import datetime
from tqdm.auto import tqdm
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
from statsmodels.tsa.stattools import adfuller
from statsmodels.tsa.seasonal import seasonal_decompose
from datetime import datetime, timedelta
# В датасете 150 признаков: 50 Источников x 6 параметров
NUM_FEATURES = 3 # Ограничимся 3 источниками для демо-проекта
# Размер окна для проверки стационарности временного ряда
WINDOW_STATIONARITY = 7
# Настроим вид таблиц:
pd.set_option("display.max_rows", 50)
pd.set_option("display.max_columns", 50)
Изучил файл Daily_Duration.xlsx и привёл его к формату csv:
# Вспомогательная функция для чтения файлов с данными
def load_dataset(file_name, separator):
'''
Функция для проверки нахождения файла и загрузки датафрейма.
'''
if os.path.exists(file_name):
data = pd.read_csv(file_name, sep = separator)
print('Dataset "', file_name, '" is loaded successfully.', sep='')
return data
else:
print('Something with', file_name, 'is wrong!')
# Загрузка данных по фактическому включению/выключению пиплметра
df_dd = load_dataset('Daily_Duration_total.csv', ';')
Dataset "Daily_Duration_total.csv" is loaded successfully.
Создаю вспомогательную функцию для изучения датафреймов.
def view_skim_df(df):
'''
Функция для единообразного изучения датафреймов.
1. Контроль размера датафрейма.
2. Вывод основных данных по датафрейму.
3. Распечатка на экране первых трёх объектов датафрейма.
'''
skim(df)
display(df.head(3))
print('Количество дубликатов:', df.duplicated().sum())
print('Полное количество пропущенных значений по всем признакам:',
df.isnull().sum().sum())
return
Рассмотрим данные, содержащиеся в датафрейме.
# Изучим содержимое датафрейма:
view_skim_df(df_dd)
╭──────────────────────────────────────────────── skimpy summary ─────────────────────────────────────────────────╮ │ Data Summary Data Types │ │ ┏━━━━━━━━━━━━━━━━━━━┳━━━━━━━━┓ ┏━━━━━━━━━━━━━┳━━━━━━━┓ │ │ ┃ dataframe ┃ Values ┃ ┃ Column Type ┃ Count ┃ │ │ ┡━━━━━━━━━━━━━━━━━━━╇━━━━━━━━┩ ┡━━━━━━━━━━━━━╇━━━━━━━┩ │ │ │ Number of rows │ 516 │ │ float64 │ 150 │ │ │ │ Number of columns │ 152 │ │ string │ 1 │ │ │ └───────────────────┴────────┘ │ int32 │ 1 │ │ │ └─────────────┴───────┘ │ │ number │ │ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━┳━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━┳━━━━━━━┳━━━━━━━┳━━━━━━━┳━━━━━━━━┓ │ │ ┃ column_name ┃ NA ┃ NA % ┃ mean ┃ sd ┃ p0 ┃ p25 ┃ p75 ┃ p100 ┃ hist ┃ │ │ ┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━╇━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━╇━━━━━━━╇━━━━━━━╇━━━━━━━╇━━━━━━━━┩ │ │ │ 2gis Web Desktop Add │ 0 │ 0 │ 0.015 │ 0.012 │ 0 │ 0.01 │ 0.02 │ 0.15 │ █▁ │ │ │ │ 2gis Web Desktop Add │ 0 │ 0 │ 3.9 │ 2.5 │ 0.25 │ 2.5 │ 4.7 │ 26 │ █▃ │ │ │ │ 2gis App Mobile AddP │ 0 │ 0 │ 0.38 │ 0.19 │ 0.06 │ 0.26 │ 0.47 │ 1 │ ▄█▅▂▁ │ │ │ │ 2gis App Mobile AddP │ 0 │ 0 │ 9.2 │ 2.6 │ 4.1 │ 7.7 │ 10 │ 32 │ ██▁ │ │ │ │ 2gis Web Mobile AddP │ 0 │ 0 │ 0.0042 │ 0.0053 │ 0 │ 0 │ 0.01 │ 0.04 │ █▅ │ │ │ │ 2gis Web Mobile AddP │ 0 │ 0 │ 0.94 │ 0.44 │ 0.17 │ 0.68 │ 1.1 │ 5.4 │ █▃ │ │ │ │ Discord Web Desktop │ 0 │ 0 │ 0.013 │ 0.014 │ 0 │ 0 │ 0.02 │ 0.11 │ █▃ │ │ │ │ Discord Web Desktop │ 0 │ 0 │ 4.5 │ 4.1 │ 0.29 │ 1.9 │ 5.6 │ 30 │ █▂▁ │ │ │ │ Discord App Mobile A │ 0 │ 0 │ 0.49 │ 0.62 │ 0.01 │ 0.12 │ 0.44 │ 2.6 │ █▁ ▁▁ │ │ │ │ Discord App Mobile A │ 0 │ 0 │ 20 │ 5.8 │ 6.8 │ 16 │ 23 │ 53 │ ▂█▃▁ │ │ │ │ Discord Web Mobile A │ 2 │ 0.39 │ 0.00014 │ 0.0013 │ 0 │ 0 │ 0 │ 0.02 │ █ │ │ │ │ Discord Web Mobile A │ 2 │ 0.39 │ 0.56 │ 1.1 │ 0.02 │ 0.23 │ 0.56 │ 19 │ █ │ │ │ │ Facebook Web Desktop │ 16 │ 3.1 │ 0.018 │ 0.019 │ 0 │ 0 │ 0.03 │ 0.08 │ █▃▂▂ │ │ │ │ Facebook Web Desktop │ 16 │ 3.1 │ 12 │ 10 │ 0.02 │ 3.2 │ 19 │ 49 │ █▄▄▁▁ │ │ │ │ Facebook App Mobile │ 0 │ 0 │ 0.066 │ 0.045 │ 0 │ 0.03 │ 0.09 │ 0.25 │ ▇█▅▁ │ │ │ │ Facebook App Mobile │ 0 │ 0 │ 9.1 │ 5.2 │ 0.46 │ 4.5 │ 12 │ 27 │ ▆▅█▃▁ │ │ │ │ Facebook Web Mobile │ 0 │ 0 │ 0.00054 │ 0.0033 │ 0 │ 0 │ 0 │ 0.06 │ █ │ │ │ │ Facebook Web Mobile │ 0 │ 0 │ 0.3 │ 0.35 │ 0.06 │ 0.17 │ 0.33 │ 6.2 │ █ │ │ │ │ Google Карты Web Des │ 0 │ 0 │ 0.014 │ 0.0091 │ 0 │ 0.01 │ 0.02 │ 0.07 │ █▃▁ │ │ │ │ Google Карты Web Des │ 0 │ 0 │ 4.4 │ 2.9 │ 0.46 │ 2.5 │ 5.3 │ 22 │ █▅▁ │ │ │ │ Google Карты App Mob │ 0 │ 0 │ 0.18 │ 0.081 │ 0.04 │ 0.13 │ 0.23 │ 0.55 │ ▃█▃▁ │ │ │ │ Google Карты App Mob │ 0 │ 0 │ 6.5 │ 2.4 │ 2 │ 4.8 │ 7.6 │ 20 │ ▅█▃ │ │ │ │ Google Карты Web Mob │ 3 │ 0.58 │ 0.00019 │ 0.0029 │ 0 │ 0 │ 0 │ 0.06 │ █ │ │ │ │ Google Карты Web Mob │ 3 │ 0.58 │ 1 │ 2.3 │ 0.02 │ 0.27 │ 1 │ 37 │ █ │ │ │ │ Google Новости Web D │ 270 │ 52 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ █ │ │ │ │ Google Новости Web D │ 270 │ 52 │ 1.1 │ 1.4 │ 0.02 │ 0.21 │ 1.4 │ 11 │ █▁ │ │ │ │ Google Новости App M │ 8 │ 1.6 │ 0.001 │ 0.0032 │ 0 │ 0 │ 0 │ 0.02 │ █ ▁ │ │ │ │ Google Новости App M │ 8 │ 1.6 │ 2.6 │ 3.1 │ 0.08 │ 0.91 │ 3 │ 24 │ █▁ │ │ │ │ Google Новости Web M │ 310 │ 61 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ █ │ │ │ │ Google Новости Web M │ 310 │ 61 │ 0.31 │ 1.3 │ 0.02 │ 0.05 │ 0.17 │ 12 │ █ │ │ │ │ Kp Web Desktop AddPe │ 0 │ 0 │ 0.0066 │ 0.008 │ 0 │ 0 │ 0.01 │ 0.06 │ ██▁ │ │ │ │ Kp Web Desktop AddPe │ 0 │ 0 │ 2.7 │ 2.8 │ 0.05 │ 1.3 │ 3.3 │ 43 │ █ │ │ │ │ Kp App Mobile AddPer │ 270 │ 52 │ 4.1e-05 │ 0.00064 │ 0 │ 0 │ 0 │ 0.01 │ █ │ │ │ │ Kp App Mobile AddPer │ 270 │ 52 │ 5.1 │ 4.9 │ 0.08 │ 1.7 │ 7.1 │ 27 │ █▃▁▁ │ │ │ │ Kp Web Mobile AddPer │ 0 │ 0 │ 0.0068 │ 0.0053 │ 0 │ 0 │ 0.01 │ 0.04 │ ▄█ │ │ │ │ Kp Web Mobile AddPer │ 0 │ 0 │ 0.63 │ 0.32 │ 0.19 │ 0.44 │ 0.72 │ 3.9 │ █▁ │ │ │ │ Mail.ru Web Desktop │ 0 │ 0 │ 0.047 │ 0.032 │ 0 │ 0.02 │ 0.07 │ 0.14 │ █▅▆▅▂▁ │ │ │ │ Mail.ru Web Desktop │ 0 │ 0 │ 4.4 │ 2.2 │ 0.2 │ 3.3 │ 5 │ 26 │ █▄ │ │ │ │ Mail.ru App Mobile A │ 8 │ 1.6 │ 0.012 │ 0.011 │ 0 │ 0 │ 0.02 │ 0.05 │ ▇█▅▂▁ │ │ │ │ Mail.ru App Mobile A │ 8 │ 1.6 │ 6.1 │ 3.4 │ 0.11 │ 3.7 │ 8.2 │ 18 │ ▅██▃▁ │ │ │ │ Mail.ru Web Mobile A │ 0 │ 0 │ 0.0018 │ 0.004 │ 0 │ 0 │ 0 │ 0.02 │ █ ▂ │ │ │ │ Mail.ru Web Mobile A │ 0 │ 0 │ 0.84 │ 0.43 │ 0.05 │ 0.53 │ 1.1 │ 3.5 │ ▅█▂ │ │ │ │ OK Web Desktop AddPe │ 0 │ 0 │ 0.91 │ 0.6 │ 0.03 │ 0.43 │ 1.2 │ 2.6 │ █▇█▂▃▁ │ │ │ │ OK Desktop AddPerU │ 0 │ 0 │ 31 │ 8.9 │ 9.1 │ 26 │ 38 │ 67 │ ▂▆█▄ │ │ │ │ OK App Mobile AddPer │ 0 │ 0 │ 3.5 │ 1.6 │ 0.53 │ 2.3 │ 4.6 │ 7.4 │ ▅▄█▇▄▁ │ │ │ │ OK App Mobile AddPer │ 0 │ 0 │ 25 │ 7.9 │ 10 │ 18 │ 30 │ 43 │ ▄▇▆█▄▃ │ │ │ │ OK Web Mobile AddPer │ 0 │ 0 │ 0.073 │ 0.043 │ 0 │ 0.04 │ 0.1 │ 0.2 │ ▆█▇▅▂▁ │ │ │ │ OK Web Mobile AddPer │ 0 │ 0 │ 3.7 │ 1.6 │ 0.51 │ 2.6 │ 4.7 │ 8.8 │ ▃▆█▄▂ │ │ │ │ Sbermarket Web Deskt │ 23 │ 4.5 │ 0.005 │ 0.0083 │ 0 │ 0 │ 0.01 │ 0.07 │ █▁ │ │ │ │ Sbermarket Desktop A │ 23 │ 4.5 │ 8.3 │ 8.9 │ 0.02 │ 2.5 │ 11 │ 78 │ █▂ │ │ │ │ Sbermarket App Mobil │ 0 │ 0 │ 0.074 │ 0.044 │ 0.01 │ 0.04 │ 0.1 │ 0.26 │ █▇▃▂ │ │ │ │ Sbermarket App Mobil │ 0 │ 0 │ 14 │ 4.5 │ 3.9 │ 11 │ 16 │ 40 │ ▃█▃▁ │ │ │ │ Sbermarket Web Mobil │ 0 │ 0 │ 0.00052 │ 0.0022 │ 0 │ 0 │ 0 │ 0.01 │ █ │ │ │ │ Sbermarket Web Mobil │ 0 │ 0 │ 2 │ 3.1 │ 0.05 │ 0.62 │ 2.3 │ 38 │ █ │ │ │ │ Sbermegamarket Web D │ 0 │ 0 │ 0.029 │ 0.026 │ 0 │ 0.01 │ 0.04 │ 0.2 │ █▂▁ │ │ │ │ Sbermegamarket Deskt │ 0 │ 0 │ 7.7 │ 5.5 │ 0.18 │ 4.3 │ 10 │ 54 │ █▃ │ │ │ │ Sbermegamarket App M │ 0 │ 0 │ 0.05 │ 0.031 │ 0 │ 0.03 │ 0.07 │ 0.24 │ ▇█▃▁ │ │ │ │ Sbermegamarket App M │ 0 │ 0 │ 9.7 │ 4.5 │ 2.4 │ 6.9 │ 11 │ 49 │ █▄ │ │ │ │ Sbermegamarket Web M │ 0 │ 0 │ 0.011 │ 0.0089 │ 0 │ 0.01 │ 0.01 │ 0.04 │ ▄█ ▂▁ │ │ │ │ Sbermegamarket Web M │ 0 │ 0 │ 2.4 │ 2.1 │ 0.32 │ 1.3 │ 2.7 │ 18 │ █▁ │ │ │ │ Smi1 Web Desktop Add │ 71 │ 14 │ 0.00088 │ 0.0028 │ 0 │ 0 │ 0 │ 0.01 │ █ ▁ │ │ │ │ Smi1 Desktop AddPerU │ 71 │ 14 │ 6.4 │ 13 │ 0.02 │ 0.41 │ 2.8 │ 74 │ █▁ │ │ │ │ Smi1 App Mobile AddP │ 260 │ 51 │ 0.0002 │ 0.0014 │ 0 │ 0 │ 0 │ 0.01 │ █ │ │ │ │ Smi1 App Mobile AddP │ 260 │ 51 │ 7.9 │ 5.6 │ 0.08 │ 4.4 │ 10 │ 45 │ █▅▁ │ │ │ │ Smi1 Web Mobile AddP │ 0 │ 0 │ 0.0016 │ 0.0038 │ 0 │ 0 │ 0 │ 0.02 │ █ ▁ │ │ │ │ Smi1 Web Mobile AddP │ 0 │ 0 │ 0.34 │ 0.19 │ 0.02 │ 0.2 │ 0.46 │ 1.3 │ ▇█▄▁ │ │ │ │ Steam Web Desktop Ad │ 1 │ 0.19 │ 0.011 │ 0.015 │ 0 │ 0 │ 0.01 │ 0.09 │ █▁▁ │ │ │ │ Steam Desktop AddPer │ 1 │ 0.19 │ 1.6 │ 1.3 │ 0.04 │ 0.9 │ 2 │ 20 │ █ │ │ │ │ Steam App Mobile Add │ 0 │ 0 │ 0.029 │ 0.042 │ 0 │ 0 │ 0.03 │ 0.22 │ █▁▁▁ │ │ │ │ Steam App Mobile Add │ 0 │ 0 │ 4.3 │ 2.2 │ 0.96 │ 3 │ 5.1 │ 22 │ █▄ │ │ │ │ Steam Web Mobile Add │ 1 │ 0.19 │ 0.0025 │ 0.012 │ 0 │ 0 │ 0 │ 0.23 │ █ │ │ │ │ Steam Web Mobile Add │ 1 │ 0.19 │ 1.3 │ 1.7 │ 0.07 │ 0.55 │ 1.5 │ 26 │ █ │ │ │ │ Telegram Web Desktop │ 0 │ 0 │ 0.097 │ 0.066 │ 0.01 │ 0.06 │ 0.12 │ 0.4 │ ▇█▂▁ │ │ │ │ Telegram Desktop Add │ 0 │ 0 │ 8.1 │ 3 │ 2 │ 6.2 │ 9.6 │ 22 │ ▃█▅▁ │ │ │ │ Telegram App Mobile │ 0 │ 0 │ 18 │ 10 │ 5.5 │ 14 │ 18 │ 52 │ ▃█ ▁▂ │ │ │ │ Telegram App Mobile │ 0 │ 0 │ 38 │ 8.7 │ 27 │ 32 │ 39 │ 72 │ █▄ ▂▁ │ │ │ │ Telegram Web Mobile │ 0 │ 0 │ 0.001 │ 0.0038 │ 0 │ 0 │ 0 │ 0.04 │ █▁ │ │ │ │ Telegram Web Mobile │ 0 │ 0 │ 1.7 │ 3.4 │ 0.06 │ 0.33 │ 1.4 │ 30 │ █ │ │ │ │ Tiktok Web Desktop A │ 0 │ 0 │ 0.0061 │ 0.019 │ 0 │ 0 │ 0.01 │ 0.25 │ █ │ │ │ │ Tiktok Desktop AddPe │ 0 │ 0 │ 3.2 │ 5.2 │ 0.05 │ 0.88 │ 3.1 │ 49 │ █ │ │ │ │ Tiktok App Mobile Ad │ 0 │ 0 │ 20 │ 15 │ 4.3 │ 12 │ 19 │ 58 │ ▅█ ▂ │ │ │ │ Tiktok App Mobile Ad │ 0 │ 0 │ 67 │ 16 │ 43 │ 55 │ 72 │ 110 │ ▄█▅ ▁▂ │ │ │ │ Tiktok Web Mobile Ad │ 0 │ 0 │ 0.02 │ 0.0079 │ 0.01 │ 0.02 │ 0.02 │ 0.06 │ ▃█▂ │ │ │ │ Tiktok Web Mobile Ad │ 0 │ 0 │ 0.83 │ 0.26 │ 0.3 │ 0.66 │ 0.96 │ 3 │ ▆█▁ │ │ │ │ Vedomosti Web Deskto │ 58 │ 11 │ 4.4e-05 │ 0.00066 │ 0 │ 0 │ 0 │ 0.01 │ █ │ │ │ │ Vedomosti Desktop Ad │ 58 │ 11 │ 1.5 │ 1.8 │ 0.02 │ 0.58 │ 1.7 │ 18 │ █▁ │ │ │ │ Vedomosti App Mobile │ 480 │ 93 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ █ │ │ │ │ Vedomosti App Mobile │ 480 │ 93 │ 2.3 │ 1.5 │ 0.17 │ 1.3 │ 2.7 │ 5.4 │ ▄▅█ ▂▃ │ │ │ │ Vedomosti Web Mobile │ 0 │ 0 │ 0.00031 │ 0.0017 │ 0 │ 0 │ 0 │ 0.01 │ █ │ │ │ │ Vedomosti Web Mobile │ 0 │ 0 │ 0.39 │ 0.37 │ 0.05 │ 0.24 │ 0.4 │ 5.3 │ █ │ │ │ │ Viber Web Desktop Ad │ 210 │ 41 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ █ │ │ │ │ Viber Desktop AddPer │ 210 │ 41 │ 0.81 │ 1.1 │ 0.02 │ 0.12 │ 0.96 │ 6.8 │ █▁▁ │ │ │ │ Viber App Mobile Add │ 0 │ 0 │ 2.2 │ 0.82 │ 0.76 │ 1.5 │ 2.8 │ 4.3 │ ▆███▂▂ │ │ │ │ Viber App Mobile Add │ 0 │ 0 │ 13 │ 2 │ 6.9 │ 12 │ 15 │ 18 │ ▂▄█▅▁ │ │ │ │ Viber Web Mobile Add │ 11 │ 2.1 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ █ │ │ │ │ Viber Web Mobile Add │ 11 │ 2.1 │ 0.23 │ 0.47 │ 0.02 │ 0.08 │ 0.23 │ 8.3 │ █ │ │ │ │ Whatsapp Web Desktop │ 0 │ 0 │ 0.044 │ 0.027 │ 0 │ 0.02 │ 0.06 │ 0.18 │ ▅█▃▁ │ │ │ │ Whatsapp Desktop Add │ 0 │ 0 │ 3.3 │ 1.6 │ 0.56 │ 2.3 │ 4 │ 12 │ ▅█▂▁ │ │ │ │ Whatsapp App Mobile │ 0 │ 0 │ 21 │ 5.3 │ 12 │ 17 │ 25 │ 31 │ ▆▅▆█▂▆ │ │ │ │ Whatsapp App Mobile │ 0 │ 0 │ 32 │ 4.2 │ 21 │ 29 │ 35 │ 41 │ ▁▃▆█▅▂ │ │ │ │ Whatsapp Web Mobile │ 0 │ 0 │ 0.00025 │ 0.0019 │ 0 │ 0 │ 0 │ 0.02 │ █ │ │ │ │ Whatsapp Web Mobile │ 0 │ 0 │ 0.33 │ 0.36 │ 0.05 │ 0.18 │ 0.36 │ 4.3 │ █ │ │ │ │ Wildberries Web Desk │ 0 │ 0 │ 0.19 │ 0.1 │ 0.01 │ 0.12 │ 0.25 │ 0.58 │ ▄█▅▂▁ │ │ │ │ Wildberries Desktop │ 0 │ 0 │ 12 │ 4.5 │ 1.8 │ 9.9 │ 14 │ 38 │ ▂█▃ │ │ │ │ Wildberries App Mobi │ 0 │ 0 │ 2.3 │ 0.71 │ 0.72 │ 2 │ 2.8 │ 3.8 │ ▄ ▇█▇▁ │ │ │ │ Wildberries App Mobi │ 0 │ 0 │ 14 │ 2.1 │ 9 │ 13 │ 15 │ 20 │ ▂▄█▇▃▁ │ │ │ │ Wildberries Web Mobi │ 0 │ 0 │ 0.057 │ 0.026 │ 0.01 │ 0.04 │ 0.07 │ 0.14 │ ▄█▅▂▁▁ │ │ │ │ Wildberries Web Mobi │ 0 │ 0 │ 2.4 │ 0.6 │ 0.89 │ 2 │ 2.7 │ 4.5 │ ▁▄█▄▁ │ │ │ │ Youtube Web Desktop │ 0 │ 0 │ 5 │ 2 │ 1.7 │ 3.7 │ 6.1 │ 10 │ ▅█▇▃▂▁ │ │ │ │ Youtube Desktop AddP │ 0 │ 0 │ 44 │ 5 │ 34 │ 41 │ 48 │ 65 │ ▂█▆▂▁ │ │ │ │ Youtube App Mobile A │ 0 │ 0 │ 35 │ 12 │ 18 │ 27 │ 40 │ 66 │ ▄█▃▁▁▂ │ │ │ │ Youtube App Mobile A │ 0 │ 0 │ 92 │ 7 │ 78 │ 87 │ 96 │ 110 │ ▃▇█▅▂▁ │ │ │ │ Youtube Web Mobile A │ 0 │ 0 │ 0.36 │ 0.13 │ 0.09 │ 0.27 │ 0.42 │ 1.1 │ ▃█▃▁ │ │ │ │ Youtube Web Mobile A │ 0 │ 0 │ 10 │ 4.3 │ 1.4 │ 7.3 │ 13 │ 28 │ ▄█▇▂▁ │ │ │ │ ВКонтакте Web Deskto │ 0 │ 0 │ 2 │ 0.83 │ 0.68 │ 1.5 │ 2.4 │ 4.8 │ ▄█▄▂▁ │ │ │ │ ВКонтакте Desktop Ad │ 0 │ 0 │ 21 │ 3 │ 13 │ 19 │ 23 │ 32 │ ▁▄█▄▁ │ │ │ │ ВКонтакте App Mobile │ 0 │ 0 │ 18 │ 8.4 │ 4.3 │ 13 │ 27 │ 33 │ ▅▄█▂▅▄ │ │ │ │ ВКонтакте App Mobile │ 0 │ 0 │ 42 │ 5.1 │ 30 │ 38 │ 46 │ 53 │ ▂▅▇█▇▂ │ │ │ │ ВКонтакте Web Mobile │ 0 │ 0 │ 0.17 │ 0.089 │ 0.03 │ 0.11 │ 0.25 │ 0.51 │ ▅█▄▃ │ │ │ │ ВКонтакте Web Mobile │ 0 │ 0 │ 1.6 │ 0.6 │ 0.63 │ 1.1 │ 2.1 │ 3.9 │ █▇█▄ │ │ │ │ Дзен Web Desktop Add │ 0 │ 0 │ 1 │ 0.63 │ 0.03 │ 0.39 │ 1.5 │ 2.2 │ █▃▅▇▄▄ │ │ │ │ Дзен Desktop AddPerU │ 0 │ 0 │ 15 │ 7.7 │ 1.1 │ 9 │ 20 │ 32 │ ▄▄▅█▃▂ │ │ │ │ Дзен App Mobile AddP │ 0 │ 0 │ 0.45 │ 0.32 │ 0.01 │ 0.12 │ 0.67 │ 1.4 │ █▄▆▃▂ │ │ │ │ Дзен App Mobile AddP │ 0 │ 0 │ 35 │ 14 │ 3.8 │ 23 │ 45 │ 69 │ ▃▅▅█▄▁ │ │ │ │ Дзен Web Mobile AddP │ 0 │ 0 │ 0.98 │ 0.47 │ 0.19 │ 0.51 │ 1.4 │ 2.2 │ ▇▂█▆▃ │ │ │ │ Дзен Web Mobile AddP │ 0 │ 0 │ 4.4 │ 2.1 │ 1.2 │ 2.4 │ 5.6 │ 10 │ █▄█▂▃ │ │ │ │ Лента: Lenta Web Des │ 23 │ 4.5 │ 0.0016 │ 0.0046 │ 0 │ 0 │ 0 │ 0.04 │ █▁ │ │ │ │ Лента: Lenta Desktop │ 23 │ 4.5 │ 4.5 │ 6.7 │ 0.02 │ 1.3 │ 5.1 │ 85 │ █ │ │ │ │ Лента: Lenta App Mob │ 0 │ 0 │ 0.023 │ 0.011 │ 0 │ 0.02 │ 0.03 │ 0.06 │ ▁▄█▄▂▁ │ │ │ │ Лента: Lenta App Mob │ 0 │ 0 │ 3.4 │ 1.2 │ 0.56 │ 2.7 │ 4.1 │ 11 │ ▂█▂ │ │ │ │ Лента: Lenta Web Mob │ 0 │ 0 │ 0.00072 │ 0.0045 │ 0 │ 0 │ 0 │ 0.07 │ █ │ │ │ │ Лента: Lenta Web Mob │ 0 │ 0 │ 1.2 │ 1.6 │ 0.07 │ 0.59 │ 1.3 │ 27 │ █ │ │ │ │ Яндекс.Картинки Lent │ 0 │ 0 │ 0.14 │ 0.07 │ 0.04 │ 0.09 │ 0.18 │ 0.52 │ ▇█▃ │ │ │ │ Яндекс.Картинки Lent │ 0 │ 0 │ 4.5 │ 1.4 │ 1.5 │ 3.6 │ 5.2 │ 9.7 │ ▂▇█▃▁ │ │ │ │ Яндекс.Картинки App │ 520 │ 100 │ nan │ nan │ nan │ nan │ nan │ nan │ │ │ │ │ Яндекс.Картинки App │ 520 │ 100 │ nan │ nan │ nan │ nan │ nan │ nan │ │ │ │ │ Яндекс.Картинки Web │ 0 │ 0 │ 0.039 │ 0.021 │ 0 │ 0.03 │ 0.05 │ 0.15 │ ▄█▄▁ │ │ │ │ Яндекс.Картинки Web │ 0 │ 0 │ 1.8 │ 0.6 │ 0.78 │ 1.4 │ 2 │ 6.8 │ █▅ │ │ │ │ Яндекс.Карты Lenta W │ 0 │ 0 │ 0.079 │ 0.042 │ 0.01 │ 0.05 │ 0.1 │ 0.31 │ ▅█▃▁ │ │ │ │ Яндекс.Карты Lenta D │ 0 │ 0 │ 5.7 │ 2.4 │ 1.1 │ 4.2 │ 6.8 │ 18 │ ▃█▃ │ │ │ │ Яндекс.Карты App Mob │ 0 │ 0 │ 0.89 │ 0.31 │ 0.27 │ 0.71 │ 1.1 │ 1.8 │ ▃▅█▄▂ │ │ │ │ Яндекс.Карты App Mob │ 0 │ 0 │ 12 │ 3.1 │ 4.8 │ 10 │ 14 │ 22 │ ▂▄█▄▂ │ │ │ │ Яндекс.Карты Web Mob │ 0 │ 0 │ 0.0094 │ 0.0071 │ 0 │ 0.01 │ 0.01 │ 0.05 │ ▃█▁ │ │ │ │ Яндекс.Карты Web Mob │ 0 │ 0 │ 2.2 │ 1.2 │ 0.19 │ 1.5 │ 2.6 │ 9.1 │ ▆█▁▁ │ │ │ │ Яндекс.Новости Lenta │ 410 │ 79 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ █ │ │ │ │ Яндекс.Новости Lenta │ 410 │ 79 │ 0.23 │ 0.34 │ 0.02 │ 0.03 │ 0.28 │ 1.9 │ █▁▁ │ │ │ │ Яндекс.Новости App M │ 520 │ 100 │ nan │ nan │ nan │ nan │ nan │ nan │ │ │ │ │ Яндекс.Новости App M │ 520 │ 100 │ nan │ nan │ nan │ nan │ nan │ nan │ │ │ │ │ Яндекс.Новости Web M │ 200 │ 38 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ █ │ │ │ │ Яндекс.Новости Web M │ 200 │ 38 │ 0.069 │ 0.091 │ 0.02 │ 0.03 │ 0.07 │ 0.88 │ █ │ │ │ │ age │ 0 │ 0 │ 29 │ 19 │ 0 │ 12 │ 45 │ 55 │ ██████ │ │ │ └───────────────────────────┴──────┴────────┴───────────┴───────────┴───────┴───────┴───────┴───────┴────────┘ │ │ string │ │ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │ │ ┃ column_name ┃ NA ┃ NA % ┃ words per row ┃ total words ┃ │ │ ┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │ │ │ Date │ 0 │ 0 │ 1 │ 520 │ │ │ └───────────────────────────┴─────────┴────────────┴──────────────────────────────┴──────────────────────────┘ │ ╰────────────────────────────────────────────────────── End ──────────────────────────────────────────────────────╯
| Date | 2gis Web Desktop AddPerP | 2gis Web Desktop AddPerU | 2gis App Mobile AddPerP | 2gis App Mobile AddPerU | 2gis Web Mobile AddPerP | 2gis Web Mobile AddPerU | Discord Web Desktop AddPerP | Discord Web Desktop AddPerU | Discord App Mobile AddPerP | Discord App Mobile AddPerU | Discord Web Mobile AddPerP | Discord Web Mobile AddPerU | Facebook Web Desktop AddPerP | Facebook Web Desktop AddPerU | Facebook App Mobile AddPerP | Facebook App Mobile AddPerU | Facebook Web Mobile AddPerP | Facebook Web Mobile AddPerU | Google Карты Web Desktop AddPerP | Google Карты Web Desktop AddPerU | Google Карты App Mobile AddPerP | Google Карты App Mobile AddPerU | Google Карты Web Mobile AddPerP | Google Карты Web Mobile AddPerU | ... | Лента: Lenta Web Desktop AddPerP | Лента: Lenta Desktop AddPerU | Лента: Lenta App Mobile AddPerP | Лента: Lenta App Mobile AddPerU | Лента: Lenta Web Mobile AddPerP | Лента: Lenta Web Mobile AddPerU | Яндекс.Картинки Lenta Web Desktop AddPerP | Яндекс.Картинки Lenta Desktop AddPerU | Яндекс.Картинки App Mobile AddPerP | Яндекс.Картинки App Mobile AddPerU | Яндекс.Картинки Web Mobile AddPerP | Яндекс.Картинки Web Mobile AddPerU | Яндекс.Карты Lenta Web Desktop AddPerP | Яндекс.Карты Lenta Desktop AddPerU | Яндекс.Карты App Mobile AddPerP | Яндекс.Карты App Mobile AddPerU | Яндекс.Карты Web Mobile AddPerP | Яндекс.Карты Web Mobile AddPerU | Яндекс.Новости Lenta Web Desktop AddPerP | Яндекс.Новости Lenta Desktop AddPerU | Яндекс.Новости App Mobile AddPerP | Яндекс.Новости App Mobile AddPerU | Яндекс.Новости Web Mobile AddPerP | Яндекс.Новости Web Mobile AddPerU | age | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 01.04.2023 | 0.010 | 3.270 | 0.360 | 10.430 | 0.000 | 0.930 | 0.030 | 8.690 | 0.430 | 20.980 | 0.000 | 0.410 | 0.020 | 14.530 | 0.070 | 9.400 | 0.000 | 0.370 | 0.010 | 3.850 | 0.180 | 7.100 | 0.000 | 0.940 | ... | 0.000 | 5.780 | 0.020 | 3.530 | 0.000 | 1.170 | 0.110 | 3.900 | NaN | NaN | 0.040 | 1.920 | 0.050 | 4.960 | 0.590 | 9.770 | 0.010 | 2.230 | 0.000 | 0.080 | NaN | NaN | NaN | NaN | 0 |
| 1 | 02.04.2023 | 0.010 | 2.290 | 0.300 | 9.110 | 0.000 | 0.970 | 0.030 | 8.370 | 0.440 | 20.240 | 0.000 | 0.220 | 0.030 | 19.410 | 0.070 | 11.240 | 0.000 | 0.270 | 0.010 | 3.780 | 0.130 | 5.570 | 0.000 | 0.650 | ... | 0.010 | 7.040 | 0.020 | 2.800 | 0.000 | 1.170 | 0.160 | 4.740 | NaN | NaN | 0.040 | 1.860 | 0.040 | 4.170 | 0.560 | 10.170 | 0.010 | 3.670 | 0.000 | 0.120 | NaN | NaN | 0.000 | 0.050 | 0 |
| 2 | 03.04.2023 | 0.020 | 4.310 | 0.260 | 6.960 | 0.010 | 1.100 | 0.010 | 3.410 | 0.350 | 17.810 | 0.000 | 0.490 | 0.030 | 18.170 | 0.060 | 8.310 | 0.000 | 0.180 | 0.030 | 7.600 | 0.120 | 4.710 | 0.000 | 0.810 | ... | 0.000 | 2.640 | 0.030 | 3.430 | 0.000 | 1.000 | 0.160 | 4.520 | NaN | NaN | 0.040 | 1.830 | 0.080 | 5.060 | 0.640 | 9.650 | 0.010 | 3.470 | NaN | NaN | NaN | NaN | 0.000 | 0.050 | 0 |
3 rows × 152 columns
Количество дубликатов: 0 Полное количество пропущенных значений по всем признакам: 7334
Сформируем список признаков:
# Список индексов удаляемых признаков, за исключением Date и age и
# количеством источников, задаваемый глобальной переменной NUM_FEATURES:
if NUM_FEATURES < 1: NUM_FEATURES = 1
if NUM_FEATURES > 25: NUM_FEATURES = 25
list_columns = [i for i in range(1 + NUM_FEATURES * 6,
len(df_dd.columns)-1)]
print('Количество удаляемых признаков:', len(list_columns))
df_dd.drop(df_dd.columns[list_columns], axis=1, inplace=True)
df_dd.head(2)
Количество удаляемых признаков: 132
| Date | 2gis Web Desktop AddPerP | 2gis Web Desktop AddPerU | 2gis App Mobile AddPerP | 2gis App Mobile AddPerU | 2gis Web Mobile AddPerP | 2gis Web Mobile AddPerU | Discord Web Desktop AddPerP | Discord Web Desktop AddPerU | Discord App Mobile AddPerP | Discord App Mobile AddPerU | Discord Web Mobile AddPerP | Discord Web Mobile AddPerU | Facebook Web Desktop AddPerP | Facebook Web Desktop AddPerU | Facebook App Mobile AddPerP | Facebook App Mobile AddPerU | Facebook Web Mobile AddPerP | Facebook Web Mobile AddPerU | age | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 01.04.2023 | 0.010 | 3.270 | 0.360 | 10.430 | 0.000 | 0.930 | 0.030 | 8.690 | 0.430 | 20.980 | 0.000 | 0.410 | 0.020 | 14.530 | 0.070 | 9.400 | 0.000 | 0.370 | 0 |
| 1 | 02.04.2023 | 0.010 | 2.290 | 0.300 | 9.110 | 0.000 | 0.970 | 0.030 | 8.370 | 0.440 | 20.240 | 0.000 | 0.220 | 0.030 | 19.410 | 0.070 | 11.240 | 0.000 | 0.270 | 0 |
Отмечаем, что осталось нужное число признаков.
Отмечаем:
Date имеет тип string. Следует перевести в datetime.Google Новости Web Desktop - 7 шт.Google Новости Web Mobile - 21 шт.Kp App Mobile - 9 шт.Smi1 App Mobile - 1 шт.Vedomosti App Mobile - 73 шт.Viber Web Desktop - 5 шт.Яндекс.Картинки App Mobile - 86 шт. - 100%.Яндекс.Новости Lenta Web Desktop - 40 шт.Яндекс.Новости App Mobile - 86 шт. - 100%.Яндекс.Новости Web Mobile - 3 шт.Date.¶Преобразуем даты из формата 'string' в формат 'datetime'
df_dd['Date'] = pd.to_datetime(df_dd.Date, format='%d.%m.%Y')
df_dd.info()
print('Для проведения исследования данные собраны в период с',
df_dd.Date.min(), 'по ', df_dd.Date.max())
<class 'pandas.core.frame.DataFrame'> RangeIndex: 516 entries, 0 to 515 Data columns (total 20 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Date 516 non-null datetime64[ns] 1 2gis Web Desktop AddPerP 516 non-null float64 2 2gis Web Desktop AddPerU 516 non-null float64 3 2gis App Mobile AddPerP 516 non-null float64 4 2gis App Mobile AddPerU 516 non-null float64 5 2gis Web Mobile AddPerP 516 non-null float64 6 2gis Web Mobile AddPerU 516 non-null float64 7 Discord Web Desktop AddPerP 516 non-null float64 8 Discord Web Desktop AddPerU 516 non-null float64 9 Discord App Mobile AddPerP 516 non-null float64 10 Discord App Mobile AddPerU 516 non-null float64 11 Discord Web Mobile AddPerP 514 non-null float64 12 Discord Web Mobile AddPerU 514 non-null float64 13 Facebook Web Desktop AddPerP 500 non-null float64 14 Facebook Web Desktop AddPerU 500 non-null float64 15 Facebook App Mobile AddPerP 516 non-null float64 16 Facebook App Mobile AddPerU 516 non-null float64 17 Facebook Web Mobile AddPerP 516 non-null float64 18 Facebook Web Mobile AddPerU 516 non-null float64 19 age 516 non-null int64 dtypes: datetime64[ns](1), float64(18), int64(1) memory usage: 80.8 KB Для проведения исследования данные собраны в период с 2023-04-01 00:00:00 по 2023-06-25 00:00:00
Отмечаем успешное преобразование формата.
df_dd = df_dd.sort_values(by=['Date', 'age'])
df_dd.head(7)
| Date | 2gis Web Desktop AddPerP | 2gis Web Desktop AddPerU | 2gis App Mobile AddPerP | 2gis App Mobile AddPerU | 2gis Web Mobile AddPerP | 2gis Web Mobile AddPerU | Discord Web Desktop AddPerP | Discord Web Desktop AddPerU | Discord App Mobile AddPerP | Discord App Mobile AddPerU | Discord Web Mobile AddPerP | Discord Web Mobile AddPerU | Facebook Web Desktop AddPerP | Facebook Web Desktop AddPerU | Facebook App Mobile AddPerP | Facebook App Mobile AddPerU | Facebook Web Mobile AddPerP | Facebook Web Mobile AddPerU | age | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 2023-04-01 | 0.010 | 3.270 | 0.360 | 10.430 | 0.000 | 0.930 | 0.030 | 8.690 | 0.430 | 20.980 | 0.000 | 0.410 | 0.020 | 14.530 | 0.070 | 9.400 | 0.000 | 0.370 | 0 |
| 86 | 2023-04-01 | 0.010 | 3.920 | 0.310 | 7.640 | 0.000 | 0.980 | 0.090 | 10.280 | 2.010 | 22.600 | 0.000 | 0.390 | 0.000 | 0.030 | 0.010 | 3.660 | 0.000 | 0.090 | 12 |
| 172 | 2023-04-01 | 0.010 | 2.150 | 0.630 | 9.850 | 0.010 | 1.230 | 0.000 | 0.830 | 0.360 | 17.150 | 0.000 | 0.500 | 0.000 | 1.390 | 0.050 | 7.290 | 0.000 | 0.170 | 25 |
| 258 | 2023-04-01 | 0.020 | 5.600 | 0.480 | 8.850 | 0.000 | 0.610 | 0.020 | 7.050 | 0.110 | 11.300 | 0.000 | 0.250 | 0.010 | 7.730 | 0.130 | 15.050 | 0.000 | 0.150 | 35 |
| 344 | 2023-04-01 | 0.010 | 2.530 | 0.240 | 8.630 | 0.000 | 0.780 | 0.040 | 17.430 | 0.230 | 35.610 | 0.000 | 0.610 | 0.010 | 6.660 | 0.090 | 8.450 | 0.010 | 1.500 | 45 |
| 430 | 2023-04-01 | 0.000 | 2.710 | 0.240 | 23.710 | 0.000 | 0.940 | 0.010 | 6.390 | 0.010 | 6.810 | 0.000 | 0.120 | 0.050 | 23.490 | 0.060 | 8.220 | 0.000 | 0.560 | 55 |
| 1 | 2023-04-02 | 0.010 | 2.290 | 0.300 | 9.110 | 0.000 | 0.970 | 0.030 | 8.370 | 0.440 | 20.240 | 0.000 | 0.220 | 0.030 | 19.410 | 0.070 | 11.240 | 0.000 | 0.270 | 0 |
Average Daily Duration суммарно по всем возрастным категориям.¶Average Daily Duration суммарно по всем возрастным категориям.¶Вспомогательная функция.
def plot_average_daily_duration(df, key, list_6values):
'''
Функция вывода графиков 'Average Daily Duration'.
'''
fg = plt.figure(figsize=(9, 4), constrained_layout=True)
gs = gridspec.GridSpec(ncols=2, nrows=1, figure=fg)
fig_ax_1 = fg.add_subplot(gs[0, 0])
for i in range(0, 6, 2):
y_title = key + ' ' + list_6values[i]
plt.plot(df['Date'], df[y_title], label=y_title)
plt.xlabel('Дата', color = 'blue')
plt.xticks(fontsize = 8, rotation=45)
plt.ylabel('Average Daily Duration на население',
fontsize = 8, color = 'blue')
plt.legend(bbox_to_anchor=(0.5, 1.3), loc='upper center')
fig_ax_2 = fg.add_subplot(gs[0, 1])
for i in range(1, 6, 2):
y_title = key + ' ' + list_6values[i]
plt.plot(df['Date'], df[y_title], label=y_title)
plt.xlabel('Дата', color = 'blue')
plt.xticks(fontsize = 8, rotation=45)
plt.ylabel('Average Daily Duration на пользователей',
fontsize = 8, color = 'blue')
plt.legend(bbox_to_anchor=(0.5, 1.3), loc='upper center')
plt.show()
Для удобства работы с большим количеством колонок упакуем их к словарь.
dict_columns = {}
list_columns = df_dd.columns[1:-1]# Убрали Date и age
for num in range(0, len(list_columns), 6):
key_dict = list_columns[num].split()[0]
list_6col = []
for i in range(6):
list_6col.append(" ".join(list_columns[num+i].split()[1:]))
dict_columns[key_dict] = list_6col
print('Количество источников информации:', len(dict_columns))
print('Список источников информации:', list(dict_columns.keys()))
Количество источников информации: 3 Список источников информации: ['2gis', 'Discord', 'Facebook']
Изобразим на графиках Average Daily Duration суммарно по всем возрастным категориям.
for k_6col, v_6cols in dict_columns.items():
plot_average_daily_duration(df_dd, k_6col, v_6cols)
Отмечаем:
Average Daily Duration суммарно по всем возрастным категориям.¶Так как данных много, чтобы это можно было выводить в одном фрагменте со множеством графиков, буду работать отдельно с каждым источником информации.
Делаем вспомогательные функции.
def graph_trend_seasonality(num, list_columns, decomp):
'''
Функция графического представления тренда и сезонности.
'''
fg = plt.figure(figsize=(9, 3), constrained_layout=True)
gs = gridspec.GridSpec(ncols=2, nrows=1, figure=fg)
fig_ax_1 = fg.add_subplot(gs[0, 0])
decomp.trend.plot(ax=plt.gca())
plt.title(list_columns[num]+' - ТРЕНД', color = 'red')
plt.xlabel('Дата получения контакта пользователя с медиа объектом.',
color = 'blue')
plt.ylabel('Значение тренда.', color = 'blue');
plt.legend()
fig_ax_2 = fg.add_subplot(gs[0, 1])
decomp.seasonal.plot(ax=plt.gca())
plt.title(list_columns[num]+' - ПЕРИОД.', color = 'red')
plt.xlabel('Дата контакта пользователя с медиа объектом.',
color = 'blue')
plt.ylabel('Значение периодическое.', color = 'blue');
plt.legend()
plt.show()
def trend_seasonality(df, key_dict, list_columns):
'''
Функция расчёта тренда и сезонности временного ряда.
'''
for num in tqdm(range(len(list_columns))):
# Создадим датафрейм и выберем для него
# признак 'Date' и один информационнный.
for_decompose = df[['Date', list_columns[num]]]
for_decompose.index = for_decompose['Date']
for_decompose = for_decompose.drop('Date', axis=1)
for_decompose.sort_index(inplace=True)
for_decompose = for_decompose.resample('1D').sum()
decomp = seasonal_decompose(for_decompose)
graph_trend_seasonality(num, list_columns, decomp)
return decomp
2gis.¶Решил делать, не прибегая к циклу, а по каждому источнику контактов потребителей отдельно, чтобы была возможность проанализировать из более тщательно.
key_dict = '2gis' # Установим в качестве источника информации '2gis'.
list_columns = [str(key_dict + ' ' + \
dict_columns[key_dict][i]) for i in range(6)]
decomposed = trend_seasonality(df_dd, key_dict, list_columns)
0%| | 0/6 [00:00<?, ?it/s]
Отмечаем:
2gis не наблюдается;2gis:ярко выраженная сезонность, с периодом около недели. Надо рассмотреть ее подробнее.Изучим сезонную (периодическую) составляющую за неделю.
Введём вспомогательные функции.
def volume_seasonal(df_dd, list_columns):
'''
Функция расчёта тренда и отображения сезонности временного ряда.
'''
for num in tqdm(range(0, len(list_columns), 2)):
fg = plt.figure(figsize=(9, 3), constrained_layout=True)
gs = gridspec.GridSpec(ncols=2, nrows=1, figure=fg)
# Создадим датафрейм и выберем для него
# признак 'Date' и один информационнный.
for_decompose = df_dd[['Date', list_columns[num]]]
for_decompose.index = for_decompose['Date']
for_decompose = for_decompose.drop('Date', axis=1)
for_decompose.sort_index(inplace=True)
for_decompose = for_decompose.resample('1D').sum()
decomp = seasonal_decompose(for_decompose)
fig_ax_1 = fg.add_subplot(gs[0, 0])
decomp.seasonal[date_start:date_stop].plot(ax=plt.gca())
plt.title(list_columns[num]+' - ПЕРИОД', color = 'red')
plt.xlabel('Дата контакта пользователя с медиа объектом.',
color = 'blue')
plt.ylabel('Значение тренда.', color = 'blue');
for_decompose = df_dd[['Date', list_columns[num+1]]]
for_decompose.index = for_decompose['Date']
for_decompose = for_decompose.drop('Date', axis=1)
for_decompose.sort_index(inplace=True)
for_decompose = for_decompose.resample('1D').sum()
decomp = seasonal_decompose(for_decompose)
fig_ax_2 = fg.add_subplot(gs[0, 1])
decomp.seasonal[date_start:date_stop].plot(ax=plt.gca())
plt.title(list_columns[num+1]+' - ПЕРИОД.', color = 'red')
plt.xlabel('Дата контакта пользователя с медиа объектом.',
color = 'blue')
plt.ylabel('Значение периодическое.', color = 'blue');
plt.tight_layout()
def calc_print_weekday(date_start, date_stop):
'''
Функция нахождения названий дней недели.
'''
date_tmp = datetime.strptime(date_start, '%Y-%m-%d')
date_end = datetime.strptime(date_stop, '%Y-%m-%d')
labels = []
while date_tmp <= date_end:
labels.append(str(date_tmp.strftime('%y-%m-%d')) + \
' - ' + date_tmp.strftime('%a'))
date_tmp = date_tmp + timedelta(days=1)
print('Дни недели:')
n = 0
for lab in labels:
if n < 3:
print(lab, 10*' ', end='')
n = n +1
else:
print(lab, end='\n')
n = 0
# Проверим правильность выбранного источника информации.
print(list_columns)
['2gis Web Desktop AddPerP', '2gis Web Desktop AddPerU', '2gis App Mobile AddPerP', '2gis App Mobile AddPerU', '2gis Web Mobile AddPerP', '2gis Web Mobile AddPerU']
date_start, date_stop = '2023-04-01', '2023-04-16'
calc_print_weekday(date_start, date_stop)
volume_seasonal(df_dd, list_columns)
Дни недели: 23-04-01 - Sat 23-04-02 - Sun 23-04-03 - Mon 23-04-04 - Tue 23-04-05 - Wed 23-04-06 - Thu 23-04-07 - Fri 23-04-08 - Sat 23-04-09 - Sun 23-04-10 - Mon 23-04-11 - Tue 23-04-12 - Wed 23-04-13 - Thu 23-04-14 - Fri 23-04-15 - Sat 23-04-16 - Sun
0%| | 0/3 [00:00<?, ?it/s]
Отмечаем:
Оценка стационарности временного ряда.
Временной ряд называется стационарным, если он не имеет тренда. Говоря более точно, среднее значение и дисперсия не меняются со смещением во времени.
Оценку стационарности проведём в способами:
визуально,Дики-Фуллера.Создадим вспомогательный функции
def visual_stationarity_1(fg, gs, df, list_columns, num, pos):
'''
Функция построения 'скользящего среднего' единичного графика.
'''
# Зададим временный датафрейм c признаком для рассчитываемых
# тестовых значений скользящего среднего:
df_tmp = df[['Date', list_columns[num+pos], 'age']].copy()
df_tmp = df_tmp.sort_values(by=['Date', 'age'])
df_tmp = df_tmp.groupby(['Date']).sum()[[list_columns[num+pos]]]
df_tmp['mean'] = (df_tmp[list_columns[num+pos]].
rolling(window = WINDOW_STATIONARITY).
mean() )
fig_ax_1 = fg.add_subplot(gs[0, 0+pos])
plt.plot(df_tmp[list_columns[num+pos]],
label = 'Кол-во контактов по дням', color = 'steelblue')
plt.plot(df_tmp['mean'],
label = 'Скользящее среднее за неделю', color = 'orange')
plt.legend(title = 'Графики:', loc = 'upper left')
plt.xticks(fontsize = 8, rotation=15)
plt.ylabel('Кол-во контактов.', color = 'blue')
plt.title(list_columns[num+pos], color = 'red')
def visual_stationarity_6(df, list_columns):
'''
Функция построения 'скользящего среднего' 6-и графиков.
'''
for num in tqdm(range(0, len(list_columns), 2)):
fg = plt.figure(figsize=(9, 3), constrained_layout=True)
gs = gridspec.GridSpec(ncols=2, nrows=1, figure=fg)
visual_stationarity_1(fg, gs, df, list_columns, num, 0)
visual_stationarity_1(fg, gs, df, list_columns, num, 1)
plt.tight_layout()
# Проверим правильность выбранного источника информации.
print(list_columns)
['2gis Web Desktop AddPerP', '2gis Web Desktop AddPerU', '2gis App Mobile AddPerP', '2gis App Mobile AddPerU', '2gis Web Mobile AddPerP', '2gis Web Mobile AddPerU']
visual_stationarity_6(df_dd, list_columns)
0%| | 0/3 [00:00<?, ?it/s]
Отмечаем отсутствие визуально фиксируемого тренда. Проверим вывод о стационарности временных рядов.
Тест Дики-Фуллера (Dickey-Fuller test).
Тест заключается в том, что нужно выполнить статистическую проверку следующей гипотезы:
Используем пороговое значение, равное 0.05 (5%).
# Настроим, чтобы числа в датасетах отражались с 3 знаками после запятой
pd.set_option('display.float_format', '{:.3f}'.format)
df_test_DF = pd.DataFrame(columns=[
'source', 'ADF criterion', 'P-value', 'Critical value 1%',
'Critical values 5%', 'Conclusion'])
def test_DF(df, columns):
'''
Функция проведения теста 'Дики-Фуллера' для проверки стационарности.
'''
for col in columns:
# Передадим функции 'adfuller' данные по изучаемому признаку и
# сохраним результат в переменной adf_test:
adf_test = adfuller(df[col].fillna(0))
if adf_test[0] < adf_test[4]["5%"]:
df_test_DF.loc[len(df_test_DF.index )] =(
[col, adf_test[0], adf_test[1], adf_test[4]["1%"],
adf_test[4]["5%"], "Стационарен."])
else:
df_test_DF.loc[len(df_test_DF.index )] =(
[col, adf_test[0], adf_test[1], adf_test[4]["1%"],
adf_test[4]["5%"],"НЕ стационарен!"])
# adf_test[4]["10%"] - если интересно!
# Запуск исполнения теста
test_DF(df_dd, list_columns)
# Просмотр датафрейма с результатами
display(df_test_DF)
# Удалим ненужный более датафрейм
del df_test_DF
| source | ADF criterion | P-value | Critical value 1% | Critical values 5% | Conclusion | |
|---|---|---|---|---|---|---|
| 0 | 2gis Web Desktop AddPerP | -4.947 | 0.000 | -3.444 | -2.867 | Стационарен. |
| 1 | 2gis Web Desktop AddPerU | -6.738 | 0.000 | -3.443 | -2.867 | Стационарен. |
| 2 | 2gis App Mobile AddPerP | -3.484 | 0.008 | -3.444 | -2.867 | Стационарен. |
| 3 | 2gis App Mobile AddPerU | -4.342 | 0.000 | -3.443 | -2.867 | Стационарен. |
| 4 | 2gis Web Mobile AddPerP | -6.632 | 0.000 | -3.443 | -2.867 | Стационарен. |
| 5 | 2gis Web Mobile AddPerU | -3.566 | 0.006 | -3.444 | -2.867 | Стационарен. |
Отмечаем, тренда не обнаружено.
Промежуточные выводы для всех шести источников '2gis':
Web Desktop. В диапазоне 22-29 мая имеется чётко выраженный максимум. Этому могут быть разные причины, например, выпускники школ искали результаты ЕГЭ, люди выбирали, как провести летний отпуск, ...
* App Mobile имеет тенденцию к повышению с середины мая и до самого конца наблюжений в конце июня. Люди интерсуются, как провести лето!
* Web Mobile на первый взгляд имеет максимум в апреле, но если сравнить в абсолютных единицах (8) с указанными выше источниками (50 и 20), то оказывается, это незначительный всплеск.
Discord.¶key_dict = 'Discord' # Установим в качестве источника информации 'Discord'.
list_columns = [str(key_dict + ' ' + \
dict_columns[key_dict][i]) for i in range(6)]
decomposed = trend_seasonality(df_dd, key_dict, list_columns)
0%| | 0/6 [00:00<?, ?it/s]
Отмечаем:
Discord не обнаружено;Discord:ярко выраженная сезонность, с периодом около недели. Надо рассмотреть ее подробнее.Изучим сезонную (периодическую) составляющую за неделю.
# Проверим правильность выбранного источника информации.
print(list_columns)
['Discord Web Desktop AddPerP', 'Discord Web Desktop AddPerU', 'Discord App Mobile AddPerP', 'Discord App Mobile AddPerU', 'Discord Web Mobile AddPerP', 'Discord Web Mobile AddPerU']
date_start, date_stop = '2023-04-01', '2023-04-16'
calc_print_weekday(date_start, date_stop)
volume_seasonal(df_dd, list_columns)
Дни недели: 23-04-01 - Sat 23-04-02 - Sun 23-04-03 - Mon 23-04-04 - Tue 23-04-05 - Wed 23-04-06 - Thu 23-04-07 - Fri 23-04-08 - Sat 23-04-09 - Sun 23-04-10 - Mon 23-04-11 - Tue 23-04-12 - Wed 23-04-13 - Thu 23-04-14 - Fri 23-04-15 - Sat 23-04-16 - Sun
0%| | 0/3 [00:00<?, ?it/s]
Отмечаем:
Оценка стационарности временного ряда.
# Проверим правильность выбранного источника информации.
print(list_columns)
['Discord Web Desktop AddPerP', 'Discord Web Desktop AddPerU', 'Discord App Mobile AddPerP', 'Discord App Mobile AddPerU', 'Discord Web Mobile AddPerP', 'Discord Web Mobile AddPerU']
visual_stationarity_6(df_dd, list_columns)
0%| | 0/3 [00:00<?, ?it/s]
Отмечаем:
Тест Дики-Фуллера (Dickey-Fuller test).
Используем пороговое значение, равное 0.05 (5%)
# Настроим, чтобы числа в датасетах отражались с 3 знаками после запятой
pd.set_option('display.float_format', '{:.3f}'.format)
df_test_DF = pd.DataFrame(columns=[
'source', 'ADF criterion', 'P-value', 'Critical value 1%',
'Critical values 5%', 'Conclusion'])
# Запуск исполнения теста
test_DF(df_dd, list_columns)
# Просмотр датафрейма с результатами
display(df_test_DF)
# Удалим ненужный более датафрейм
del df_test_DF
| source | ADF criterion | P-value | Critical value 1% | Critical values 5% | Conclusion | |
|---|---|---|---|---|---|---|
| 0 | Discord Web Desktop AddPerP | -5.267 | 0.000 | -3.444 | -2.867 | Стационарен. |
| 1 | Discord Web Desktop AddPerU | -5.394 | 0.000 | -3.443 | -2.867 | Стационарен. |
| 2 | Discord App Mobile AddPerP | -4.633 | 0.000 | -3.444 | -2.867 | Стационарен. |
| 3 | Discord App Mobile AddPerU | -3.925 | 0.002 | -3.443 | -2.867 | Стационарен. |
| 4 | Discord Web Mobile AddPerP | -22.893 | 0.000 | -3.443 | -2.867 | Стационарен. |
| 5 | Discord Web Mobile AddPerU | -7.341 | 0.000 | -3.443 | -2.867 | Стационарен. |
Промежуточные выводы для всех шести источников 'Discord':
периодичность (или сезонность) для всех трёх источников 2gis: везде наблюдается ярко выраженная сезонность, с периодом около недели. Надо рассмотреть ее подробнее.
Facebook.¶key_dict = 'Facebook' # Установим в качестве источника информации 'Discord'.
list_columns = [str(key_dict + ' ' + \
dict_columns[key_dict][i]) for i in range(6)]
decomposed = trend_seasonality(df_dd, key_dict, list_columns)
0%| | 0/6 [00:00<?, ?it/s]
Отмечаем:
Facebook не наблюдается;Изучим сезонную (периодическую) составляющую за неделю.
# Проверим правильность выбранного источника информации.
print(list_columns)
['Facebook Web Desktop AddPerP', 'Facebook Web Desktop AddPerU', 'Facebook App Mobile AddPerP', 'Facebook App Mobile AddPerU', 'Facebook Web Mobile AddPerP', 'Facebook Web Mobile AddPerU']
date_start, date_stop = '2023-04-01', '2023-04-16'
calc_print_weekday(date_start, date_stop)
volume_seasonal(df_dd, list_columns)
Дни недели: 23-04-01 - Sat 23-04-02 - Sun 23-04-03 - Mon 23-04-04 - Tue 23-04-05 - Wed 23-04-06 - Thu 23-04-07 - Fri 23-04-08 - Sat 23-04-09 - Sun 23-04-10 - Mon 23-04-11 - Tue 23-04-12 - Wed 23-04-13 - Thu 23-04-14 - Fri 23-04-15 - Sat 23-04-16 - Sun
0%| | 0/3 [00:00<?, ?it/s]
Отмечаем:
Оценка стационарности временного ряда.
# Проверим правильность выбранного источника информации.
print(list_columns)
['Facebook Web Desktop AddPerP', 'Facebook Web Desktop AddPerU', 'Facebook App Mobile AddPerP', 'Facebook App Mobile AddPerU', 'Facebook Web Mobile AddPerP', 'Facebook Web Mobile AddPerU']
visual_stationarity_6(df_dd, list_columns)
0%| | 0/3 [00:00<?, ?it/s]
Отмечаем отсутствие визуально фиксируемого тренда. Проверим вывод о стационарности временных рядов.
Тест Дики-Фуллера (Dickey-Fuller test).
Используем пороговое значение, равное 0.05 (5%)
# Настроим, чтобы числа в датасетах отражались с 3 знаками после запятой
pd.set_option('display.float_format', '{:.3f}'.format)
df_test_DF = pd.DataFrame(columns=[
'source', 'ADF criterion', 'P-value', 'Critical value 1%',
'Critical values 5%', 'Conclusion'])
# Запуск исполнения теста
test_DF(df_dd, list_columns)
# Просмотр датафрейма с результатами
display(df_test_DF)
# Удалим ненужный более датафрейм
del df_test_DF
| source | ADF criterion | P-value | Critical value 1% | Critical values 5% | Conclusion | |
|---|---|---|---|---|---|---|
| 0 | Facebook Web Desktop AddPerP | -3.702 | 0.004 | -3.444 | -2.867 | Стационарен. |
| 1 | Facebook Web Desktop AddPerU | -4.963 | 0.000 | -3.444 | -2.867 | Стационарен. |
| 2 | Facebook App Mobile AddPerP | -3.411 | 0.011 | -3.444 | -2.867 | Стационарен. |
| 3 | Facebook App Mobile AddPerU | -3.709 | 0.004 | -3.444 | -2.867 | Стационарен. |
| 4 | Facebook Web Mobile AddPerP | -13.997 | 0.000 | -3.443 | -2.867 | Стационарен. |
| 5 | Facebook Web Mobile AddPerU | -13.552 | 0.000 | -3.443 | -2.867 | Стационарен. |
Промежуточные выводы для всех шести источников 'Facebook':
Average Daily Duration по возрастной категории 'до 12 лет'.¶print("Размер полного датафрейма:", df_dd.shape)
Размер полного датафрейма: (516, 20)
df_dd_0 = df_dd[df_dd.age == 0]
if (df_dd.shape[0] / 6 == df_dd_0.shape[0]):
print("Выделение части датафрейма проведено корректно.")
else:
print("Произошла потеря данных!")
print("Размер датафрейма по возрастной категории 'до 12 лет':",
df_dd_0.shape)
df_dd_0.head(3)
Выделение части датафрейма проведено корректно. Размер датафрейма по возрастной категории 'до 12 лет': (86, 20)
| Date | 2gis Web Desktop AddPerP | 2gis Web Desktop AddPerU | 2gis App Mobile AddPerP | 2gis App Mobile AddPerU | 2gis Web Mobile AddPerP | 2gis Web Mobile AddPerU | Discord Web Desktop AddPerP | Discord Web Desktop AddPerU | Discord App Mobile AddPerP | Discord App Mobile AddPerU | Discord Web Mobile AddPerP | Discord Web Mobile AddPerU | Facebook Web Desktop AddPerP | Facebook Web Desktop AddPerU | Facebook App Mobile AddPerP | Facebook App Mobile AddPerU | Facebook Web Mobile AddPerP | Facebook Web Mobile AddPerU | age | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 2023-04-01 | 0.010 | 3.270 | 0.360 | 10.430 | 0.000 | 0.930 | 0.030 | 8.690 | 0.430 | 20.980 | 0.000 | 0.410 | 0.020 | 14.530 | 0.070 | 9.400 | 0.000 | 0.370 | 0 |
| 1 | 2023-04-02 | 0.010 | 2.290 | 0.300 | 9.110 | 0.000 | 0.970 | 0.030 | 8.370 | 0.440 | 20.240 | 0.000 | 0.220 | 0.030 | 19.410 | 0.070 | 11.240 | 0.000 | 0.270 | 0 |
| 2 | 2023-04-03 | 0.020 | 4.310 | 0.260 | 6.960 | 0.010 | 1.100 | 0.010 | 3.410 | 0.350 | 17.810 | 0.000 | 0.490 | 0.030 | 18.170 | 0.060 | 8.310 | 0.000 | 0.180 | 0 |
Для удобства работы с большим количеством колонок упакуем их к словарь.
dict_columns = {}
list_columns = df_dd_0.columns[1:-1]# Убрали Date и age
for num in range(0, len(list_columns), 6):
key_dict = list_columns[num].split()[0]
list_6col = []
for i in range(6):
list_6col.append(" ".join(list_columns[num+i].split()[1:]))
dict_columns[key_dict] = list_6col
Average Daily Duration по возрастной категории 'до 12 лет'.¶Изобразим на графиках Average Daily Duration по возрастной категории 'до 12 лет'.
for k_6col, v_6cols in dict_columns.items():
plot_average_daily_duration(df_dd_0, k_6col, v_6cols)
Отмечаем:
Average Daily Duration по возрастной категории 'до 12 лет'.¶2gis.¶key_dict = '2gis' # Установим в качестве источника информации '2gis'.
list_columns = [str(key_dict + ' ' + \
dict_columns[key_dict][i]) for i in range(6)]
decomposed = trend_seasonality(df_dd_0, key_dict, list_columns)
0%| | 0/6 [00:00<?, ?it/s]
Отмечаем:
2gis не наблюдается;2gis:ярко выраженная сезонность, с периодом около недели. Надо рассмотреть ее подробнее.Изучим сезонную (периодическую) составляющую за неделю.
# Проверим правильность выбранного источника информации.
print(list_columns)
['2gis Web Desktop AddPerP', '2gis Web Desktop AddPerU', '2gis App Mobile AddPerP', '2gis App Mobile AddPerU', '2gis Web Mobile AddPerP', '2gis Web Mobile AddPerU']
date_start, date_stop = '2023-04-01', '2023-04-16'
calc_print_weekday(date_start, date_stop)
volume_seasonal(df_dd_0, list_columns)
Дни недели: 23-04-01 - Sat 23-04-02 - Sun 23-04-03 - Mon 23-04-04 - Tue 23-04-05 - Wed 23-04-06 - Thu 23-04-07 - Fri 23-04-08 - Sat 23-04-09 - Sun 23-04-10 - Mon 23-04-11 - Tue 23-04-12 - Wed 23-04-13 - Thu 23-04-14 - Fri 23-04-15 - Sat 23-04-16 - Sun
0%| | 0/3 [00:00<?, ?it/s]
Отмечаем:
Оценка стационарности временного ряда.
Оценку стационарности проведём в способами:
визуально,Дики-Фуллера.visual_stationarity_6(df_dd_0, list_columns)
0%| | 0/3 [00:00<?, ?it/s]
Отмечаем отсутствие визуально фиксируемого тренда. Проверим вывод о стационарности временных рядов.
Тест Дики-Фуллера (Dickey-Fuller test).
Используем пороговое значение, равное 0.05 (5%).
# Настроим, чтобы числа в датасетах отражались с 3 знаками после запятой
pd.set_option('display.float_format', '{:.3f}'.format)
df_test_DF = pd.DataFrame(columns=[
'source', 'ADF criterion', 'P-value', 'Critical value 1%',
'Critical values 5%', 'Conclusion'])
# Запуск исполнения теста
test_DF(df_dd_0, list_columns)
# Просмотр датафрейма с результатами
display(df_test_DF)
# Удалим ненужный более датафрейм
del df_test_DF
| source | ADF criterion | P-value | Critical value 1% | Critical values 5% | Conclusion | |
|---|---|---|---|---|---|---|
| 0 | 2gis Web Desktop AddPerP | -4.858 | 0.000 | -3.511 | -2.897 | Стационарен. |
| 1 | 2gis Web Desktop AddPerU | -3.925 | 0.002 | -3.513 | -2.897 | Стационарен. |
| 2 | 2gis App Mobile AddPerP | -1.186 | 0.679 | -3.516 | -2.899 | НЕ стационарен! |
| 3 | 2gis App Mobile AddPerU | -6.173 | 0.000 | -3.510 | -2.896 | Стационарен. |
| 4 | 2gis Web Mobile AddPerP | -6.939 | 0.000 | -3.511 | -2.897 | Стационарен. |
| 5 | 2gis Web Mobile AddPerU | -7.321 | 0.000 | -3.510 | -2.896 | Стационарен. |
Отмечаем:
Промежуточные выводы для всех шести источников '2gis':
Discord.¶key_dict = 'Discord' # Установим в качестве источника информации 'Discord'.
list_columns = [str(key_dict + ' ' + \
dict_columns[key_dict][i]) for i in range(6)]
decomposed = trend_seasonality(df_dd_0, key_dict, list_columns)
0%| | 0/6 [00:00<?, ?it/s]
Отмечаем:
Discord не наблюдается;Discord:ярко выраженная сезонность, с периодом около недели. Надо рассмотреть ее подробнее.Изучим сезонную (периодическую) составляющую за неделю.
date_start, date_stop = '2023-04-01', '2023-04-16'
calc_print_weekday(date_start, date_stop)
volume_seasonal(df_dd_0, list_columns)
Дни недели: 23-04-01 - Sat 23-04-02 - Sun 23-04-03 - Mon 23-04-04 - Tue 23-04-05 - Wed 23-04-06 - Thu 23-04-07 - Fri 23-04-08 - Sat 23-04-09 - Sun 23-04-10 - Mon 23-04-11 - Tue 23-04-12 - Wed 23-04-13 - Thu 23-04-14 - Fri 23-04-15 - Sat 23-04-16 - Sun
0%| | 0/3 [00:00<?, ?it/s]
Отмечаем:
Оценка стационарности временного ряда.
visual_stationarity_6(df_dd_0, list_columns)
0%| | 0/3 [00:00<?, ?it/s]
Отмечаем:
Тест Дики-Фуллера (Dickey-Fuller test).
Используем пороговое значение, равное 0.05 (5%).
# Настроим, чтобы числа в датасетах отражались с 3 знаками после запятой
pd.set_option('display.float_format', '{:.3f}'.format)
df_test_DF = pd.DataFrame(columns=[
'source', 'ADF criterion', 'P-value', 'Critical value 1%',
'Critical values 5%', 'Conclusion'])
# Запуск исполнения теста
test_DF(df_dd_0, list_columns)
# Просмотр датафрейма с результатами
display(df_test_DF)
# Удалим ненужный более датафрейм
del df_test_DF
| source | ADF criterion | P-value | Critical value 1% | Critical values 5% | Conclusion | |
|---|---|---|---|---|---|---|
| 0 | Discord Web Desktop AddPerP | -4.384 | 0.000 | -3.515 | -2.898 | Стационарен. |
| 1 | Discord Web Desktop AddPerU | -8.098 | 0.000 | -3.510 | -2.896 | Стационарен. |
| 2 | Discord App Mobile AddPerP | -2.073 | 0.255 | -3.516 | -2.899 | НЕ стационарен! |
| 3 | Discord App Mobile AddPerU | -2.072 | 0.256 | -3.521 | -2.901 | НЕ стационарен! |
| 4 | Discord Web Mobile AddPerP | NaN | NaN | -3.510 | -2.896 | НЕ стационарен! |
| 5 | Discord Web Mobile AddPerU | -8.091 | 0.000 | -3.510 | -2.896 | Стационарен. |
Промежуточные выводы для всех шести источников 'Discord':
Facebook.¶key_dict = 'Facebook' # Установим в качестве источника информации 'Discord'.
list_columns = [str(key_dict + ' ' + \
dict_columns[key_dict][i]) for i in range(6)]
decomposed = trend_seasonality(df_dd_0, key_dict, list_columns)
0%| | 0/6 [00:00<?, ?it/s]
Отмечаем:
Facebook не наблюдается;Изучим сезонную (периодическую) составляющую за неделю.
date_start, date_stop = '2023-04-01', '2023-04-16'
calc_print_weekday(date_start, date_stop)
volume_seasonal(df_dd_0, list_columns)
Дни недели: 23-04-01 - Sat 23-04-02 - Sun 23-04-03 - Mon 23-04-04 - Tue 23-04-05 - Wed 23-04-06 - Thu 23-04-07 - Fri 23-04-08 - Sat 23-04-09 - Sun 23-04-10 - Mon 23-04-11 - Tue 23-04-12 - Wed 23-04-13 - Thu 23-04-14 - Fri 23-04-15 - Sat 23-04-16 - Sun
0%| | 0/3 [00:00<?, ?it/s]
Отмечаем для возрастной группы до 12 лет:
ПК и ноутбуки в основном по воскресеньям.мобильные приложение в основном по субботам.Оценка стационарности временного ряда.
visual_stationarity_6(df_dd_0, list_columns)
0%| | 0/3 [00:00<?, ?it/s]
Отмечаем:
Тест Дики-Фуллера (Dickey-Fuller test).
Используем пороговое значение, равное 0.05 (5%).
# Настроим, чтобы числа в датасетах отражались с 3 знаками после запятой
pd.set_option('display.float_format', '{:.3f}'.format)
df_test_DF = pd.DataFrame(columns=[
'source', 'ADF criterion', 'P-value', 'Critical value 1%',
'Critical values 5%', 'Conclusion'])
# Запуск исполнения теста
test_DF(df_dd_0, list_columns)
# Просмотр датафрейма с результатами
display(df_test_DF)
# Удалим ненужный более датафрейм
del df_test_DF
| source | ADF criterion | P-value | Critical value 1% | Critical values 5% | Conclusion | |
|---|---|---|---|---|---|---|
| 0 | Facebook Web Desktop AddPerP | -7.220 | 0.000 | -3.510 | -2.896 | Стационарен. |
| 1 | Facebook Web Desktop AddPerU | -7.891 | 0.000 | -3.510 | -2.896 | Стационарен. |
| 2 | Facebook App Mobile AddPerP | -0.039 | 0.955 | -3.519 | -2.900 | НЕ стационарен! |
| 3 | Facebook App Mobile AddPerU | -0.449 | 0.902 | -3.519 | -2.900 | НЕ стационарен! |
| 4 | Facebook Web Mobile AddPerP | -9.220 | 0.000 | -3.510 | -2.896 | Стационарен. |
| 5 | Facebook Web Mobile AddPerU | -9.187 | 0.000 | -3.510 | -2.896 | Стационарен. |
Промежуточные выводы для всех шести источников 'Facebook' по возрастной группе до 12 лет:
ПК и ноутбуки в основном по воскресеньям.мобильные приложение в основном по субботам.# уберем из памяти ненужный более датафрейм.
del df_dd_0
Average Daily Duration по возрастной категории 'от 12 до 24 лет'.¶print("Размер полного датафрейма:", df_dd.shape)
df_dd_12 = df_dd[df_dd.age == 12]
if (df_dd.shape[0] / 6 == df_dd_12.shape[0]):
print("Выделение части датафрейма проведено корректно.")
else:
print("Произошла потеря данных!")
print("Размер датафрейма по возрастной категории 'до 12 лет':",
df_dd_12.shape)
df_dd_12.head(3)
Размер полного датафрейма: (516, 20) Выделение части датафрейма проведено корректно. Размер датафрейма по возрастной категории 'до 12 лет': (86, 20)
| Date | 2gis Web Desktop AddPerP | 2gis Web Desktop AddPerU | 2gis App Mobile AddPerP | 2gis App Mobile AddPerU | 2gis Web Mobile AddPerP | 2gis Web Mobile AddPerU | Discord Web Desktop AddPerP | Discord Web Desktop AddPerU | Discord App Mobile AddPerP | Discord App Mobile AddPerU | Discord Web Mobile AddPerP | Discord Web Mobile AddPerU | Facebook Web Desktop AddPerP | Facebook Web Desktop AddPerU | Facebook App Mobile AddPerP | Facebook App Mobile AddPerU | Facebook Web Mobile AddPerP | Facebook Web Mobile AddPerU | age | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 86 | 2023-04-01 | 0.010 | 3.920 | 0.310 | 7.640 | 0.000 | 0.980 | 0.090 | 10.280 | 2.010 | 22.600 | 0.000 | 0.390 | 0.000 | 0.030 | 0.010 | 3.660 | 0.000 | 0.090 | 12 |
| 87 | 2023-04-02 | 0.000 | 0.990 | 0.170 | 4.110 | 0.000 | 0.420 | 0.110 | 11.160 | 1.950 | 20.120 | 0.000 | 0.250 | 0.000 | 0.070 | 0.010 | 5.240 | 0.000 | 0.130 | 12 |
| 88 | 2023-04-03 | 0.010 | 2.830 | 0.210 | 4.820 | 0.000 | 0.770 | 0.000 | 0.790 | 1.630 | 18.950 | 0.000 | 0.440 | 0.000 | 0.440 | 0.010 | 1.550 | 0.000 | 0.180 | 12 |
Для удобства работы с с повторяющимися по функционалу колонками упакуем их к словарь.
dict_columns = {}
list_columns = df_dd_12.columns[1:-1]# Убрали Date и age
for num in range(0, len(list_columns), 6):
key_dict = list_columns[num].split()[0]
list_6col = []
for i in range(6):
list_6col.append(" ".join(list_columns[num+i].split()[1:]))
dict_columns[key_dict] = list_6col
Average Daily Duration по возрастной категории 'от 12 до 24 лет'.¶Изобразим на графиках Average Daily Duration о возрастной категории 'от 12 до 24 лет'.
for k_6col, v_6cols in dict_columns.items():
plot_average_daily_duration(df_dd_12, k_6col, v_6cols)
Отмечаем:
Average Daily Duration по возрастной категории 'от 12 до 24 лет'.¶¶2gis.¶key_dict = '2gis' # Установим в качестве источника информации '2gis'.
list_columns = [str(key_dict + ' ' + \
dict_columns[key_dict][i]) for i in range(6)]
decomposed = trend_seasonality(df_dd_12, key_dict, list_columns)
0%| | 0/6 [00:00<?, ?it/s]
Отмечаем:
2gis App Mobile;2gis:ярко выраженная сезонность, с периодом около недели. Надо рассмотреть ее подробнее.Изучим сезонную (периодическую) составляющую за неделю.
date_start, date_stop = '2023-04-01', '2023-04-16'
calc_print_weekday(date_start, date_stop)
volume_seasonal(df_dd_12, list_columns)
Дни недели: 23-04-01 - Sat 23-04-02 - Sun 23-04-03 - Mon 23-04-04 - Tue 23-04-05 - Wed 23-04-06 - Thu 23-04-07 - Fri 23-04-08 - Sat 23-04-09 - Sun 23-04-10 - Mon 23-04-11 - Tue 23-04-12 - Wed 23-04-13 - Thu 23-04-14 - Fri 23-04-15 - Sat 23-04-16 - Sun
0%| | 0/3 [00:00<?, ?it/s]
Отмечаем:
Оценка стационарности временного ряда.
Оценку стационарности проведём в способами:
визуально,Дики-Фуллера.visual_stationarity_6(df_dd_12, list_columns)
0%| | 0/3 [00:00<?, ?it/s]
Отмечаем:
2gis App Mobile. Проверю свои наблюдения о не стационарности временных рядов.2gis Web Desktop и 2gis Web Mobile.Тест Дики-Фуллера (Dickey-Fuller test).
Используем пороговое значение, равное 0.05 (5%).
# Настроим, чтобы числа в датасетах отражались с 3 знаками после запятой
pd.set_option('display.float_format', '{:.3f}'.format)
df_test_DF = pd.DataFrame(columns=[
'source', 'ADF criterion', 'P-value', 'Critical value 1%',
'Critical values 5%', 'Conclusion'])
# Запуск исполнения теста
test_DF(df_dd_12, list_columns)
# Просмотр датафрейма с результатами
display(df_test_DF)
# Удалим ненужный более датафрейм
del df_test_DF
| source | ADF criterion | P-value | Critical value 1% | Critical values 5% | Conclusion | |
|---|---|---|---|---|---|---|
| 0 | 2gis Web Desktop AddPerP | -8.702 | 0.000 | -3.510 | -2.896 | Стационарен. |
| 1 | 2gis Web Desktop AddPerU | -7.924 | 0.000 | -3.510 | -2.896 | Стационарен. |
| 2 | 2gis App Mobile AddPerP | -4.730 | 0.000 | -3.511 | -2.897 | Стационарен. |
| 3 | 2gis App Mobile AddPerU | -5.339 | 0.000 | -3.511 | -2.897 | Стационарен. |
| 4 | 2gis Web Mobile AddPerP | -7.771 | 0.000 | -3.510 | -2.896 | Стационарен. |
| 5 | 2gis Web Mobile AddPerU | -6.928 | 0.000 | -3.510 | -2.896 | Стационарен. |
Промежуточные выводы для всех шести источников '2gis':
Discord.¶key_dict = 'Discord' # Установим в качестве источника информации 'Discord'.
list_columns = [str(key_dict + ' ' + \
dict_columns[key_dict][i]) for i in range(6)]
decomposed = trend_seasonality(df_dd_12, key_dict, list_columns)
0%| | 0/6 [00:00<?, ?it/s]
Отмечаем:
Discord не наблюдается;Discord:ярко выраженная сезонность, с периодом около недели. Надо рассмотреть ее подробнее.Изучим сезонную (периодическую) составляющую за неделю.
date_start, date_stop = '2023-04-01', '2023-04-16'
calc_print_weekday(date_start, date_stop)
volume_seasonal(df_dd_12, list_columns)
Дни недели: 23-04-01 - Sat 23-04-02 - Sun 23-04-03 - Mon 23-04-04 - Tue 23-04-05 - Wed 23-04-06 - Thu 23-04-07 - Fri 23-04-08 - Sat 23-04-09 - Sun 23-04-10 - Mon 23-04-11 - Tue 23-04-12 - Wed 23-04-13 - Thu 23-04-14 - Fri 23-04-15 - Sat 23-04-16 - Sun
0%| | 0/3 [00:00<?, ?it/s]
Отмечаем периодические закономерности длиной в 1 неделю есть для всех источников. Но их поведение можно объяснить только малыми значениями исследуемых величин.
Оценка стационарности временного ряда.
visual_stationarity_6(df_dd_12, list_columns)
0%| | 0/3 [00:00<?, ?it/s]
Отмечаем:
Тест Дики-Фуллера (Dickey-Fuller test).
Используем пороговое значение, равное 0.05 (5%).
# Настроим, чтобы числа в датасетах отражались с 3 знаками после запятой
pd.set_option('display.float_format', '{:.3f}'.format)
df_test_DF = pd.DataFrame(columns=[
'source', 'ADF criterion', 'P-value', 'Critical value 1%',
'Critical values 5%', 'Conclusion'])
# Запуск исполнения теста
test_DF(df_dd_12, list_columns)
# Просмотр датафрейма с результатами
display(df_test_DF)
# Удалим ненужный более датафрейм
del df_test_DF
| source | ADF criterion | P-value | Critical value 1% | Critical values 5% | Conclusion | |
|---|---|---|---|---|---|---|
| 0 | Discord Web Desktop AddPerP | -7.582 | 0.000 | -3.510 | -2.896 | Стационарен. |
| 1 | Discord Web Desktop AddPerU | -7.570 | 0.000 | -3.510 | -2.896 | Стационарен. |
| 2 | Discord App Mobile AddPerP | -8.804 | 0.000 | -3.510 | -2.896 | Стационарен. |
| 3 | Discord App Mobile AddPerU | -1.857 | 0.353 | -3.516 | -2.899 | НЕ стационарен! |
| 4 | Discord Web Mobile AddPerP | -9.519 | 0.000 | -3.510 | -2.896 | Стационарен. |
| 5 | Discord Web Mobile AddPerU | -9.451 | 0.000 | -3.510 | -2.896 | Стационарен. |
Промежуточные выводы для всех шести источников 'Discord':
Discord:ярко выраженная сезонность, с периодом около недели.Facebook.¶key_dict = 'Facebook' # Установим в качестве источника информации 'Facebook'.
list_columns = [str(key_dict + ' ' + \
dict_columns[key_dict][i]) for i in range(6)]
decomposed = trend_seasonality(df_dd_12, key_dict, list_columns)
0%| | 0/6 [00:00<?, ?it/s]
Отмечаем:
Изучим сезонную (периодическую) составляющую за неделю.
date_start, date_stop = '2023-04-01', '2023-04-16'
calc_print_weekday(date_start, date_stop)
volume_seasonal(df_dd_12, list_columns)
Дни недели: 23-04-01 - Sat 23-04-02 - Sun 23-04-03 - Mon 23-04-04 - Tue 23-04-05 - Wed 23-04-06 - Thu 23-04-07 - Fri 23-04-08 - Sat 23-04-09 - Sun 23-04-10 - Mon 23-04-11 - Tue 23-04-12 - Wed 23-04-13 - Thu 23-04-14 - Fri 23-04-15 - Sat 23-04-16 - Sun
0%| | 0/3 [00:00<?, ?it/s]
Отмечаем для возрастной группы от 12 до 24 лет периодические закономерности длиной в 1 неделю есть для всех источников. Но их поведение можно объяснить только малыми значениями исследуемых величин.
Оценка стационарности временного ряда.
visual_stationarity_6(df_dd_12, list_columns)
0%| | 0/3 [00:00<?, ?it/s]
Отмечаем:
Тест Дики-Фуллера (Dickey-Fuller test).
Используем пороговое значение, равное 0.05 (5%).
# Настроим, чтобы числа в датасетах отражались с 3 знаками после запятой
pd.set_option('display.float_format', '{:.3f}'.format)
df_test_DF = pd.DataFrame(columns=[
'source', 'ADF criterion', 'P-value', 'Critical value 1%',
'Critical values 5%', 'Conclusion'])
# Запуск исполнения теста
test_DF(df_dd_12, list_columns)
# Просмотр датафрейма с результатами
display(df_test_DF)
# Удалим ненужный более датафрейм
del df_test_DF
| source | ADF criterion | P-value | Critical value 1% | Critical values 5% | Conclusion | |
|---|---|---|---|---|---|---|
| 0 | Facebook Web Desktop AddPerP | -9.519 | 0.000 | -3.510 | -2.896 | Стационарен. |
| 1 | Facebook Web Desktop AddPerU | -8.519 | 0.000 | -3.510 | -2.896 | Стационарен. |
| 2 | Facebook App Mobile AddPerP | -1.384 | 0.590 | -3.521 | -2.901 | НЕ стационарен! |
| 3 | Facebook App Mobile AddPerU | -7.021 | 0.000 | -3.510 | -2.896 | Стационарен. |
| 4 | Facebook Web Mobile AddPerP | -9.831 | 0.000 | -3.510 | -2.896 | Стационарен. |
| 5 | Facebook Web Mobile AddPerU | -2.059 | 0.261 | -3.515 | -2.898 | НЕ стационарен! |
Промежуточные выводы для всех шести источников 'Facebook' по возрастной группе от 12 до 24 лет::
# уберем из памяти ненужный более датафрейм.
del df_dd_12
Average Daily Duration по возрастной категории 'от 55 лет'.¶print("Размер полного датафрейма:", df_dd.shape)
df_dd_55 = df_dd[df_dd.age == 55]
if (df_dd.shape[0] / 6 == df_dd_55.shape[0]):
print("Выделение части датафрейма проведено корректно.")
else:
print("Произошла потеря данных!")
print("Размер датафрейма по возрастной категории 'от 55 лет':",
df_dd_55.shape)
df_dd_55.head(3)
Размер полного датафрейма: (516, 20) Выделение части датафрейма проведено корректно. Размер датафрейма по возрастной категории 'от 55 лет': (86, 20)
| Date | 2gis Web Desktop AddPerP | 2gis Web Desktop AddPerU | 2gis App Mobile AddPerP | 2gis App Mobile AddPerU | 2gis Web Mobile AddPerP | 2gis Web Mobile AddPerU | Discord Web Desktop AddPerP | Discord Web Desktop AddPerU | Discord App Mobile AddPerP | Discord App Mobile AddPerU | Discord Web Mobile AddPerP | Discord Web Mobile AddPerU | Facebook Web Desktop AddPerP | Facebook Web Desktop AddPerU | Facebook App Mobile AddPerP | Facebook App Mobile AddPerU | Facebook Web Mobile AddPerP | Facebook Web Mobile AddPerU | age | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 430 | 2023-04-01 | 0.000 | 2.710 | 0.240 | 23.710 | 0.000 | 0.940 | 0.010 | 6.390 | 0.010 | 6.810 | 0.000 | 0.120 | 0.050 | 23.490 | 0.060 | 8.220 | 0.000 | 0.560 | 55 |
| 431 | 2023-04-02 | 0.010 | 4.620 | 0.190 | 17.520 | 0.000 | 1.840 | 0.000 | 5.440 | 0.020 | 20.040 | 0.000 | 0.410 | 0.060 | 29.210 | 0.080 | 14.240 | 0.000 | 0.350 | 55 |
| 432 | 2023-04-03 | 0.030 | 7.610 | 0.120 | 10.240 | 0.010 | 1.770 | 0.000 | 4.450 | 0.010 | 12.110 | 0.000 | 0.150 | 0.080 | 29.140 | 0.040 | 7.710 | 0.000 | 0.260 | 55 |
# Для удобства работы с с повторяющимися по функционалу колонками упакуем их к словарь.
dict_columns = {}
list_columns = df_dd_55.columns[1:-1]# Убрали Date и age
for num in range(0, len(list_columns), 6):
key_dict = list_columns[num].split()[0]
list_6col = []
for i in range(6):
list_6col.append(" ".join(list_columns[num+i].split()[1:]))
dict_columns[key_dict] = list_6col
Average Daily Duration по возрастной категории 'от 55 лет'.¶# Изобразим на графиках `Average Daily Duration`
# данные о возрастной категории 'от 12 до 24 лет'.
for k_6col, v_6cols in dict_columns.items():
plot_average_daily_duration(df_dd_55, k_6col, v_6cols)
Отмечаем:
Average Daily Duration по возрастной категории 'от 55 лет'.¶2gis.¶key_dict = '2gis' # Установим в качестве источника информации '2gis'.
list_columns = [str(key_dict + ' ' + \
dict_columns[key_dict][i]) for i in range(6)]
decomposed = trend_seasonality(df_dd_55, key_dict, list_columns)
0%| | 0/6 [00:00<?, ?it/s]
Отмечаем:
2gis:ярко выраженная сезонность, с периодом около недели. Надо рассмотреть ее подробнее.Изучим сезонную (периодическую) составляющую за неделю.
date_start, date_stop = '2023-04-01', '2023-04-16'
calc_print_weekday(date_start, date_stop)
volume_seasonal(df_dd_55, list_columns)
Дни недели: 23-04-01 - Sat 23-04-02 - Sun 23-04-03 - Mon 23-04-04 - Tue 23-04-05 - Wed 23-04-06 - Thu 23-04-07 - Fri 23-04-08 - Sat 23-04-09 - Sun 23-04-10 - Mon 23-04-11 - Tue 23-04-12 - Wed 23-04-13 - Thu 23-04-14 - Fri 23-04-15 - Sat 23-04-16 - Sun
0%| | 0/3 [00:00<?, ?it/s]
Отмечаем:
Оценка стационарности временного ряда.
Оценку стационарности проведём в способами:
визуально,Дики-Фуллера.visual_stationarity_6(df_dd_55, list_columns)
0%| | 0/3 [00:00<?, ?it/s]
Отмечаем:
2gis Web Desktop и 2gis Web Mobile.Тест Дики-Фуллера (Dickey-Fuller test).
Используем пороговое значение, равное 0.05 (5%).
# Настроим, чтобы числа в датасетах отражались с 3 знаками после запятой
pd.set_option('display.float_format', '{:.3f}'.format)
df_test_DF = pd.DataFrame(columns=[
'source', 'ADF criterion', 'P-value', 'Critical value 1%',
'Critical values 5%', 'Conclusion'])
# Запуск исполнения теста
test_DF(df_dd_55, list_columns)
# Просмотр датафрейма с результатами
display(df_test_DF)
# Удалим ненужный более датафрейм
del df_test_DF
| source | ADF criterion | P-value | Critical value 1% | Critical values 5% | Conclusion | |
|---|---|---|---|---|---|---|
| 0 | 2gis Web Desktop AddPerP | -10.255 | 0.000 | -3.510 | -2.896 | Стационарен. |
| 1 | 2gis Web Desktop AddPerU | -8.486 | 0.000 | -3.511 | -2.897 | Стационарен. |
| 2 | 2gis App Mobile AddPerP | -7.770 | 0.000 | -3.510 | -2.896 | Стационарен. |
| 3 | 2gis App Mobile AddPerU | -8.195 | 0.000 | -3.510 | -2.896 | Стационарен. |
| 4 | 2gis Web Mobile AddPerP | -9.757 | 0.000 | -3.510 | -2.896 | Стационарен. |
| 5 | 2gis Web Mobile AddPerU | -8.365 | 0.000 | -3.510 | -2.896 | Стационарен. |
Промежуточные выводы для всех шести источников '2gis':
Discord.¶key_dict = 'Discord' # Установим в качестве источника информации 'Discord'.
list_columns = [str(key_dict + ' ' + \
dict_columns[key_dict][i]) for i in range(6)]
decomposed = trend_seasonality(df_dd_55, key_dict, list_columns)
0%| | 0/6 [00:00<?, ?it/s]
Отмечаем:
Discord не наблюдается;Discord:ярко выраженная сезонность, с периодом около недели. Надо рассмотреть ее подробнее.Изучим сезонную (периодическую) составляющую за неделю.
date_start, date_stop = '2023-04-01', '2023-04-16'
calc_print_weekday(date_start, date_stop)
volume_seasonal(df_dd_55, list_columns)
Дни недели: 23-04-01 - Sat 23-04-02 - Sun 23-04-03 - Mon 23-04-04 - Tue 23-04-05 - Wed 23-04-06 - Thu 23-04-07 - Fri 23-04-08 - Sat 23-04-09 - Sun 23-04-10 - Mon 23-04-11 - Tue 23-04-12 - Wed 23-04-13 - Thu 23-04-14 - Fri 23-04-15 - Sat 23-04-16 - Sun
0%| | 0/3 [00:00<?, ?it/s]
Отмечаем периодические закономерности длиной в 1 неделю есть для всех источников. Но их поведение можно объяснить только малыми значениями исследуемых величин.
Оценка стационарности временного ряда.
visual_stationarity_6(df_dd_55, list_columns)
0%| | 0/3 [00:00<?, ?it/s]
Отмечаем:
Тест Дики-Фуллера (Dickey-Fuller test).
Используем пороговое значение, равное 0.05 (5%).
# Настроим, чтобы числа в датасетах отражались с 3 знаками после запятой
pd.set_option('display.float_format', '{:.3f}'.format)
df_test_DF = pd.DataFrame(columns=[
'source', 'ADF criterion', 'P-value', 'Critical value 1%',
'Critical values 5%', 'Conclusion'])
# Запуск исполнения теста
test_DF(df_dd_55, list_columns)
# Просмотр датафрейма с результатами
display(df_test_DF)
# Удалим ненужный более датафрейм
del df_test_DF
| source | ADF criterion | P-value | Critical value 1% | Critical values 5% | Conclusion | |
|---|---|---|---|---|---|---|
| 0 | Discord Web Desktop AddPerP | -10.853 | 0.000 | -3.510 | -2.896 | Стационарен. |
| 1 | Discord Web Desktop AddPerU | -1.424 | 0.571 | -3.521 | -2.901 | НЕ стационарен! |
| 2 | Discord App Mobile AddPerP | -4.276 | 0.000 | -3.513 | -2.897 | Стационарен. |
| 3 | Discord App Mobile AddPerU | -2.901 | 0.045 | -3.512 | -2.897 | Стационарен. |
| 4 | Discord Web Mobile AddPerP | NaN | NaN | -3.510 | -2.896 | НЕ стационарен! |
| 5 | Discord Web Mobile AddPerU | -6.162 | 0.000 | -3.510 | -2.896 | Стационарен. |
Промежуточные выводы для всех шести источников 'Discord':
Discord:ярко выраженная сезонность, с периодом около недели.Facebook.¶key_dict = 'Facebook' # Установим в качестве источника информации 'Facebook'.
list_columns = [str(key_dict + ' ' + \
dict_columns[key_dict][i]) for i in range(6)]
decomposed = trend_seasonality(df_dd_55, key_dict, list_columns)
0%| | 0/6 [00:00<?, ?it/s]
Отмечаем:
Изучим сезонную (периодическую) составляющую за неделю.
date_start, date_stop = '2023-04-01', '2023-04-16'
calc_print_weekday(date_start, date_stop)
volume_seasonal(df_dd_55, list_columns)
Дни недели: 23-04-01 - Sat 23-04-02 - Sun 23-04-03 - Mon 23-04-04 - Tue 23-04-05 - Wed 23-04-06 - Thu 23-04-07 - Fri 23-04-08 - Sat 23-04-09 - Sun 23-04-10 - Mon 23-04-11 - Tue 23-04-12 - Wed 23-04-13 - Thu 23-04-14 - Fri 23-04-15 - Sat 23-04-16 - Sun
0%| | 0/3 [00:00<?, ?it/s]
Отмечаем для возрастной группы от 55 лет периодические закономерности длиной в 1 неделю есть для всех источников. Но их поведение можно объяснить только малыми значениями исследуемых величин.
Оценка стационарности временного ряда.
visual_stationarity_6(df_dd_55, list_columns)
0%| | 0/3 [00:00<?, ?it/s]
Отмечаем:
Тест Дики-Фуллера (Dickey-Fuller test).
Используем пороговое значение, равное 0.05 (5%).
# Настроим, чтобы числа в датасетах отражались с 3 знаками после запятой
pd.set_option('display.float_format', '{:.3f}'.format)
df_test_DF = pd.DataFrame(columns=[
'source', 'ADF criterion', 'P-value', 'Critical value 1%',
'Critical values 5%', 'Conclusion'])
# Запуск исполнения теста
test_DF(df_dd_55, list_columns)
# Просмотр датафрейма с результатами
display(df_test_DF)
# Удалим ненужный более датафрейм
del df_test_DF
Промежуточные выводы для всех шести источников 'Facebook' по возрастной группе от 55 лет:
# уберем из памяти ненужный более датафрейм.
del df_dd_55
По результатам исследования можно отметить следующие факты и сделать приводимые ниже выводы:
Daily_Duration находятся примерно 516 записей и 152 признака.